/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.mindbox.mueblesalpes.presentacion.producto;

import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.MuebleInventario;
import com.mindbox.mueblesalpes.negocio.entity.TipoMueble;
import com.mindbox.mueblesalpes.negocio.producto.IProductoService;
import com.mindbox.mueblesalpes.negocio.producto.ProductoService;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.context.FacesContext;
import org.richfaces.component.html.HtmlDataTable;

/**
 * Backing Bean asociado a /productos/list.xhtml Encargado de listar y realizar
 * busquedas de productos
 * @author Catalina
 */

public class ProductoListBean {

    private static final String EDIT = "edit";
    private static final String INSERT = "insert";
    private static final String INVENTARIO = "inventario";
    
    private String referencia;
    private String nombre;
    private String tipo;

    private List<Mueble> listMuebles;
    private HtmlDataTable tabla;    
    private int seleccionProductoEliminar;

    @EJB
    private IProductoService productoService;
    

    /** Creates a new instance of ProductoListBean */
    public ProductoListBean() {
    }

    @PostConstruct
    private void init(){
        setReferencia(new String());
        setNombre(new String());
        setTipo(new String());
        setTabla(new HtmlDataTable());
        setSeleccionProductoEliminar(0);
        setListMuebles(productoService.consultarMuebles());
    }

    /**
     * Método que permite direcciona a la pagina de edición del producto
     * @return regla de navegación de edición
     */
    public String editar(){
        int seleccion = (Integer) getTabla().getRowKey();

        if (seleccion > getListMuebles().size()) {
            return null;
        }

        Mueble muebleSeleccionado = (Mueble) getListMuebles().get(seleccion);

        FacesContext facesContext = FacesContext.getCurrentInstance();
        facesContext.getExternalContext().getSessionMap().put("MuebleEdit", muebleSeleccionado);

        return EDIT;
    }

    /**
     * Método que permite consultar los muebles en el sistema
     * @return
     */
    public String consultarMuebles(){
        setListMuebles(productoService.consultarMuebles());
        return null;
    }

    /**
     * Método que permite consultar mueble
     * @return
     */
    public String consultarMueble(){

        Mueble mueble = new Mueble();
        try{
            if(getReferencia() != null && !referencia.equals("")){
                mueble.setReferencia(getReferencia());
            }
            if(getNombre() != null && !nombre.equals("")){
                mueble.setNombre(getNombre());
            }
            if(getTipo().equals(TipoMueble.EXTERIOR.toString())){
                mueble.setTipoMueble(TipoMueble.EXTERIOR);
            }else if(getTipo().equals(TipoMueble.INTERIOR.toString())){
                mueble.setTipoMueble(TipoMueble.INTERIOR);
            }
            setListMuebles(productoService.consultarMueble(mueble));
        }catch(Exception e){
            Mensajes.asignarMensajeError("search.error");
        }
        return null;
    }

    /**
     * Método que direcciona a la página de inserción de productos
     * @return regra de navegación
     */
    public String insert(){
        setReferencia("");
        setNombre("");
        setTipo("");
        return INSERT;
    }

    /**
     * Método que direcciona a la página de inventario de productos
     * @return regla de navegación
     */
    public String inventario(){
        setReferencia("");
        setNombre("");
        setTipo("");
        return INVENTARIO;
    }

    /**
     * Método que permite eliminar productos del sistema
     * @return regla de navegación
     */
    public String eliminar(){
        
        try{
            if (getSeleccionProductoEliminar() > getListMuebles().size()) {
                return null;
            }

            Mueble muebleSeleccionado = (Mueble) getListMuebles().get(getSeleccionProductoEliminar());
            MuebleInventario muebleInventario = productoService.consultarMuebleInventarioPorMueble(muebleSeleccionado);
            productoService.eliminarProductoInventario(muebleInventario);
            productoService.eliminarProducto(muebleSeleccionado);
            
            setListMuebles(productoService.consultarMuebles());
            setReferencia("");
            setNombre("");
            setTipo("");
        }catch(Exception e){
            Mensajes.asignarMensajeError("search.delete.error");
        }
        return null;
    }

    /**
     * Método que permite obtener el producto seleccionado
     * @return null
     */
    public String obtenerProductoEliminar(){
        try{
            setSeleccionProductoEliminar((int) (Integer) getTabla().getRowKey());

        }catch(Exception e){
            Mensajes.asignarMensajeError("search.delete.error");
        }
        return null;
    }

    /**
     * @return the referencia
     */
    public String getReferencia() {
        return referencia;
    }

    /**
     * @param referencia the referencia to set
     */
    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    /**
     * @return the nombre
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * @param nombre the nombre to set
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * @return the tipo
     */
    public String getTipo() {
        return tipo;
    }

    /**
     * @param tipo the tipo to set
     */
    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    /**
     * @return the listMuebles
     */
    public List<Mueble> getListMuebles() {
        return listMuebles;
    }

    /**
     * @param listMuebles the listMuebles to set
     */
    public void setListMuebles(List<Mueble> listMuebles) {
        this.listMuebles = listMuebles;
    }

    /**
     * @return the tabla
     */
    public HtmlDataTable getTabla() {
        return tabla;
    }

    /**
     * @param tabla the tabla to set
     */
    public void setTabla(HtmlDataTable tabla) {
        this.tabla = tabla;
    }

    /**
     * @return the seleccionProductoEliminar
     */
    public int getSeleccionProductoEliminar() {
        return seleccionProductoEliminar;
    }

    /**
     * @param seleccionProductoEliminar the seleccionProductoEliminar to set
     */
    public void setSeleccionProductoEliminar(int seleccionProductoEliminar) {
        this.seleccionProductoEliminar = seleccionProductoEliminar;
    }
}
